package com.xiexiaozhou.helper.core.service.impl;

import com.xiexiaozhou.helper.core.domain.Customer;
import com.xiexiaozhou.helper.core.domain.Manager;
import com.xiexiaozhou.helper.core.domain.Order;
import com.xiexiaozhou.helper.core.repository.CustomerRepository;
import com.xiexiaozhou.helper.core.repository.OrderRepository;
import com.xiexiaozhou.helper.core.service.CustomerService;
import com.xiexiaozhou.helper.core.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 订单
 * create：创建订单，状态：1
 * list：订单列表（分页）
 * listForSelf：客户订单列表（分页）
 * get：通过id获取订单
 * pay：支付订单，状态：2
 * assign：管理员派单，状态：3
 * claim：配送员接单，状态：4
 * confirmByDistributor：配送员确认送达，状态：5
 * confirmByCustomer：客户确认收货，状态：6
 * evaluate：客户评价订单，状态：7
 * delete：删除订单，状态：9
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderRepository orderRepository;

    /**
     * 创建订单，订单状态为1：新订单
     *
     * @param order
     * @param customerId
     * @return
     */
    @Override
    public Order create(Order order, Long customerId) {
        //订单状态
        order.setStatus(1);
        //谁下单
        Customer customer = new Customer(1L);
        order.setCustomer(customer);
        //下单时间
        order.setCreateTime(new Date());

        //保存订单
        return orderRepository.save(order);
    }

    /**
     * 订单列表（分页）
     *
     * @param pageable
     * @return
     */
    @Override
    public Page<Order> list(Pageable pageable) {
        return orderRepository.findAll(pageable);
    }

    /**
     * 客户订单列表（分页）
     *
     * @param customer
     * @param pageable
     * @return
     */
    @Override
    public Page<Order> listForSelf(Customer customer, Pageable pageable) {
        return orderRepository.findByCustomer(customer, pageable);
    }

    /**
     * 通过id获取订单信息
     *
     * @param orderId
     * @return
     */
    @Override
    public Order get(Long orderId) {
        return orderRepository.findOne(orderId);
    }

    /**
     * 支付订单
     *
     * @param orderId
     * @return
     */
    @Override
    public Order pay(Long orderId) {
        Order order = orderRepository.findOne(orderId);
        order.setStatus(2);
        order.setPayTime(new Date());
        return orderRepository.save(order);
    }

    /**
     * 管理员指派订单订单状态改为3：已派单
     *
     * @param orderId    订单id
     * @param assignId   由谁指派(管理员)
     * @param designeeId 指派给谁(配送员)
     * @return
     */
    @Override
    public Order assign(Long orderId, Long assignId, Long designeeId) {
        //通过订单id获取订单
        Order order = orderRepository.findOne(orderId);

        //订单状态
        order.setStatus(3);
        //管理员
        Manager manager = new Manager(assignId);
        order.setAssignor(manager);
        //配送员
        Customer customer = new Customer(designeeId);
        order.setDesignee(customer);
        //指派时间
        order.setAssignTime(new Date());

        //更新订单
        return orderRepository.save(order);
    }

    /**
     * 配送员接单，订单状态改为4：配送中
     *
     * @param orderId
     * @return
     */
    @Override
    public Order claim(Long orderId) {
        //通过订单id获取订单信息
        Order order = orderRepository.findOne(orderId);

        //订单状态
        order.setStatus(4);
        //接单时间
        order.setReceiptTime(new Date());

        //更新订单
        return orderRepository.save(order);
    }

    /**
     * 由配送员确认订单已送达，订单状态改为5：已送达
     *
     * @param orderId
     * @return
     */
    @Override
    public Order confirmByDistributor(Long orderId) {
        //通过订单id获取订单信息
        Order order = orderRepository.findOne(orderId);
        //订单状态
        order.setStatus(5);
        //送达时间
        order.setSendToTime(new Date());

        //更新订单
        return orderRepository.save(order);
    }

    /**
     * 由客户确认订单已送达，订单状态改为6：已收货
     *
     * @param orderId
     * @return
     */
    @Override
    public Order confirmByCustomer(Long orderId) {
        //通过订单id获取订单信息
        Order order = orderRepository.findOne(orderId);

        //订单状态
        order.setStatus(6);
        //确认收货时间
        order.setDeliveryTime(new Date());

        //更新订单
        return orderRepository.save(order);
    }

    /**
     * 评价订单，订单状态该为7：已评价
     *
     * @param orderId
     * @param evaluateContent
     * @return
     */
    @Override
    public Order evaluate(Long orderId, String evaluateContent) {
        //通过订单id获取订单信息
        Order order = orderRepository.findOne(orderId);

        //状态
        order.setStatus(7);
        //评价内容
        order.setEvaluateContent(evaluateContent);
        //评价时间
        order.setEvaluateTime(new Date());

        //更新订单
        return orderRepository.save(order);
    }

    /**
     * 删除订单
     *
     * @param orderId
     * @return
     */
    @Override
    public Order delete(Long orderId) {
        Order order = orderRepository.findOne(orderId);
        order.setStatus(8);
        return orderRepository.save(order);
    }

    /**
     * 修改订单
     *
     * @param order
     * @return
     */
    @Override
    public Order modify(Order order) {
        return orderRepository.save(order);
    }

    /**
     * 指派给我的订单
     *
     * @param customer
     * @return
     */
    @Override
    public List<Order> assign(Customer customer) {
        return orderRepository.findByDesignee(customer);
    }
}
